// Copyright Epic Games, Inc. All Rights Reserved.

#include "Replays/AsyncAction_QueryReplays.h"

#include "GameFramework/PlayerController.h"
#include "LyraReplaySubsystem.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(AsyncAction_QueryReplays)

UAsyncAction_QueryReplays::UAsyncAction_QueryReplays(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
}

/**
 * 查询回放的静态方法
 */
UAsyncAction_QueryReplays* UAsyncAction_QueryReplays::QueryReplays(APlayerController* InPlayerController)
{
	UAsyncAction_QueryReplays* Action = nullptr; // 初始化动作为空

	if (InPlayerController != nullptr) // 如果玩家控制器有效
	{
		Action = NewObject<UAsyncAction_QueryReplays>(); // 创建新的异步操作对象
		Action->PlayerController = InPlayerController; // 设置玩家控制器
	}

	return Action; // 返回动作
}

/**
 * 激活异步操作
 */
void UAsyncAction_QueryReplays::Activate()
{
	ReplayStreamer = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer(); // 创建回放流器

	ResultList = NewObject<ULyraReplayList>(); // 创建结果列表对象
	if (ReplayStreamer.IsValid()) // 如果回放流器有效
	{
		FNetworkReplayVersion EnumerateStreamsVersion = FNetworkVersion::GetReplayVersion(); // 获取回放版本

		ReplayStreamer->EnumerateStreams(EnumerateStreamsVersion, INDEX_NONE, FString(), TArray<FString>(), FEnumerateStreamsCallback::CreateUObject(this, &ThisClass::OnEnumerateStreamsComplete)); // 枚举流
	}
	else
	{
		QueryComplete.Broadcast(ResultList); // 广播查询完成
	}
}

/**
 * 当枚举流完成时调用
 */
void UAsyncAction_QueryReplays::OnEnumerateStreamsComplete(const FEnumerateStreamsResult& Result)
{
	for (const FNetworkReplayStreamInfo& StreamInfo : Result.FoundStreams) // 遍历找到的流
	{
		ULyraReplayListEntry* NewReplayEntry = NewObject<ULyraReplayListEntry>(ResultList); // 创建新的回放列表条目
		NewReplayEntry->StreamInfo = StreamInfo; // 设置流信息
		ResultList->Results.Add(NewReplayEntry); // 添加到结果列表
	}

	// 按日期对演示名称进行排序
	Algo::SortBy(ResultList->Results, [](const TObjectPtr<ULyraReplayListEntry>& Data) { return Data->StreamInfo.Timestamp.GetTicks(); }, TGreater<>()); // 使用时间戳排序

	QueryComplete.Broadcast(ResultList); // 广播查询完成
}